home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Programmer Disk
/
The Programmer Disk (Microforum).iso
/
xpro
/
pascal
/
pro6
/
actigram.pas
next >
Wrap
Pascal/Delphi Source File
|
1989-03-19
|
27KB
|
835 lines
PROGRAM ACTIGRAM;
{$V-}
{ Program to manage an activity network }
{ Copyright (c) by Namir C. Shammas, 1984 }
CONST Max_Tasks = 50; { Maximum number of tasks }
Max_Gen_Func_List = 5; { Maximum number of generic Functions }
TYPE
STRING50 = STRING[50];
{ Record defining the structre of a task }
Job = RECORD
Task_Name : STRING[10];
Func_Name : STRING50;
Gen_Func, Level : INTEGER;
N_Calls, N_Responses : INTEGER;
Calls, Responses : ARRAY [1..Max_Tasks] OF INTEGER;
END;
{ Record defining the entire data base }
Job_array = RECORD
Title : STRING[80];
N_Tasks : INTEGER;
Tasks : ARRAY [1..Max_Tasks] OF Job;
END;
Filed_Data = FILE OF Job_array; { Data type to enable file I/O }
VAR
Task_array : Job_array;
Gen_Func_List : ARRAY [0..Max_Gen_Func_List] OF STRING50;
Name : STRING50;
Data_File : Filed_Data;
Lock_on_Task : BOOLEAN;
Choice, Copy_Task, Insert_Loc, Task_Num, Line,
Level, Max_Line, Page_Num : INTEGER;
Dev_Num : 1..3 ;
Filename : STRING[12];
Dev_Out : TEXT;
{---------------------------------------------------------------------}
PROCEDURE INC(VAR I : INTEGER);
BEGIN
I := I + 1
END;
{---------------------------------------------------------------------}
PROCEDURE DINC(VAR I : INTEGER; J : INTEGER);
BEGIN
I := I + J
END;
{---------------------------------------------------------------------}
PROCEDURE DEC(VAR I : INTEGER);
BEGIN
I := I - 1
END;
{---------------------------------------------------------------------}
PROCEDURE DDEC(VAR I : INTEGER; J : INTEGER);
BEGIN
I := I - J
END;
{---------------------------------------------------------------------}
PROCEDURE Message( S : STRING50);
{ Procedure to display a message then wait for the user to press any }
{ before resuming execution. }
BEGIN
WRITELN;
WRITELN(S);
WRITELN; WRITELN('Press any key to continue');
WHILE NOT Keypressed DO;
END; { Message }
{---------------------------------------------------------------------}
PROCEDURE Load_Gen_Func;
{ Procedure to load the generic Functions array }
BEGIN
Gen_Func_List[1] := 'MAIN';
Gen_Func_List[2] := 'I/O';
Gen_Func_List[3] := 'CALCULATIONS';
Gen_Func_List[4] := 'DATA MANAGEMENT';
Gen_Func_List[5] := 'MENU';
END; { Load_Gen_Func }
{---------------------------------------------------------------------}
PROCEDURE OUTWRITELN(S : STRING50);
{ Procedure to send output text, followed by a CR }
BEGIN
CASE Dev_Num OF
1 : WRITELN(S);
2 : WRITELN(Lst,S);
3 : WRITELN(Dev_Out,S);
END; { CASE }
END; { OUTWRITELN }
{---------------------------------------------------------------------}
PROCEDURE OUTWRITE(S : STRING50);
{ Procedure to to send output text }
BEGIN
CASE Dev_Num OF
1 : WRITE(S);
2 : WRITE(Lst,S);
3 : WRITE(Dev_Out,S);
END; { CASE }
END; { OUTWRITE }
{---------------------------------------------------------------------}
PROCEDURE Load(VAR Filename : Filed_Data; VAR Task_array : Job_array);
{ Procedure to load an actigram save on file }
VAR Name : STRING[12];
BEGIN
WRITE('Enter filename '); READLN(Name);
Assign(Filename,Name);
Reset(Filename);
READ(Filename,Task_array);
Close(Filename);
WRITELN;
WRITELN('Loaded actigram : ',Task_array.Title);
Message(' ');
END;{ Load }
{---------------------------------------------------------------------}
PROCEDURE Save(VAR Filename : Filed_Data; VAR Task_array : Job_array);
{ Procedure to save an actigram on file }
VAR Name : STRING[12];
BEGIN
WRITE('Enter filename '); READLN(Name);
Assign(Filename,Name);
Rewrite(Filename);
WRITE(Filename,Task_array);
Close(Filename);
WRITELN;
END;{ Save }
{---------------------------------------------------------------------}
PROCEDURE New_File;
{ Procedure to initialize a new actigram }
BEGIN
WITH Task_array DO
BEGIN
N_Tasks := 1;
Tasks[1].Task_Name := 'M A I N';
Tasks[1].Func_Name := 'ROOT';
Tasks[1].Level := 0;
Tasks[1].Gen_Func := 0;
Tasks[1].N_Calls := 0;
Tasks[1].N_Responses := 0;
WRITE('Enter Title for new actigram ');
READLN(Title);
END;
END;{ New_File }
{---------------------------------------------------------------------}
PROCEDURE Center_Text(S : STRING50; Line_No : INTEGER);
{ Procedure to center text }
VAR i : INTEGER;
BEGIN
i := 40 - Length(S) DIV 2;
GotoXY(1,Line_No); ClrEol;
GotoXY(i,Line_No);
WRITELN(S);
END;{ Center_Text }
{---------------------------------------------------------------------}
PROCEDURE List_Links(Index : INTEGER);
{ Procedure to list all links to a particular task }
CONST Remark = 'Press return to continue, or q<cr> to exit';
VAR i, j, N, First, Last : INTEGER;
Answer : CHAR;
BEGIN
WITH Task_array DO
BEGIN
ClrScr;
N := Tasks[Index].N_Calls;
IF N > 0 THEN
BEGIN
WRITELN(' ',Tasks[Index].Task_Name); WRITELN;
First := 1;
IF N > 22 THEN Last := 22 ELSE Last := N;
REPEAT
FOR i := First TO Last DO
BEGIN
j := Tasks[Index].Calls[i];
WRITELN(i,' |---> ',Tasks[j].Task_Name,' : ',
Tasks[j].Func_Name);
DINC(First,22);
DINC(Last,22);
IF Last <= N
THEN
BEGIN { Ask user to continue or quit }
WRITELN;
WRITELN(Remark);
READLN(Answer);
IF Answer IN ['Q','q'] THEN Last := N;
END; { IF }
END; { FOR }
UNTIL Last > N;
Message(' ');
END; { IF N > 0 }
END;{ WITH }
END; {List_Links }
{---------------------------------------------------------------------}
PROCEDURE List_Atoms;
{ Procedure to list all tasks and allow the user to choose a particular }
{ task for a desired action. }
CONST Remark = 'Press return to continue, or q<cr> to exit';
VAR i, First, Last, Lines_in_Page : INTEGER;
Answer : CHAR;
BEGIN
Lines_in_Page := 22;
WITH Task_array DO
BEGIN
First := 1;
IF N_Tasks > Lines_in_Page THEN Last := Lines_in_Page
ELSE Last := N_Tasks;
REPEAT { Loop to display tasks }
ClrScr;
WRITELN('### Task Name');
FOR i := First TO Last DO
WRITELN(i,' ',Tasks[i].Task_Name);
DINC(First,Lines_in_Page);
DINC(Last,Lines_in_Page);
IF Last <= N_Tasks
THEN
BEGIN { Ask user to continue or quit }
WRITELN;
WRITELN(Remark);
READLN(Answer);
IF Answer IN ['Q','q'] THEN Last := N_Tasks;
END; { IF }
UNTIL Last > N_Tasks;
REPEAT
WRITELN;
WRITE('Enter selected task number '); READLN(Task_Num);
UNTIL Task_Num IN [1..N_Tasks];
List_Links(Task_Num);
END; { WITH }
END;{ List_Atoms }
{------------------------------------------------------------}
FUNCTION Search(T : STRING50; VAR Index : INTEGER): BOOLEAN;
{ Procedure to search for a task name }
VAR i : INTEGER;
Found : BOOLEAN;
BEGIN
Found := FALSE;
WITH Task_array DO
BEGIN
i := 1; Index := 0;
WHILE (i <= N_Tasks) AND (Found = FALSE) DO
BEGIN
IF T = Tasks[i].Task_Name { Task already exists }
THEN
BEGIN
Found := TRUE;
Index := i;
END
ELSE IF T < Tasks[i].Task_Name { New task is to be inserted }
THEN
BEGIN
Index := i;
i := N_Tasks;
END; { IF }
INC(i);
END; { WHILE }
END; { WITH }
Search := Found;
END; { Search }
{---------------------------------------------------------------------}
PROCEDURE Input_Task(Index : INTEGER);
{ Procedure to input a task }
VAR i : INTEGER;
BEGIN
WITH Task_array DO
BEGIN
WRITELN;
WRITE('Enter Function of task ');
READLN(Tasks[Index].Func_Name); WRITELN;
WRITELN('Generic Function list');
FOR i := 1 TO Max_Gen_Func_List DO
WRITELN('# ',i,' ::= ',Gen_Func_List[i]);
WRITELN;
REPEAT
WRITE('Enter generic Function number ');
READLN(Tasks[Index].Gen_Func);
UNTIL Tasks[Index].Gen_Func IN [1..Max_Gen_Func_List];
WRITELN;
END; { WITH }
END;{ Input_Task }
{---------------------------------------------------------------------}
PROCEDURE Append_Task(T_Name : STRING50; Index : INTEGER);
{ Procedure to append an existsing task to the call/response lists }
VAR i : INTEGER;
BEGIN
WITH Task_array DO
BEGIN
IF (Tasks[Task_Num].N_Calls = Max_Tasks) OR
(Tasks[Index].N_Responses = Max_Tasks)
THEN
Message('Overloading in call/response list')
ELSE
BEGIN
INC(Tasks[Task_Num].N_Calls);
i := Tasks[Task_Num].N_Calls;
Tasks[Task_Num].Calls[i] := Index;
INC(Tasks[Index].N_Responses);
i := Tasks[Index].N_Responses;
Tasks[Index].Responses[i] := Task_Num;
IF Tasks[Index].Level <= Tasks[Task_Num].Level
THEN
Tasks[Index].Level := Tasks[Task_Num].Level + 1;
END; { IF }
END; { WITH }
END;{ Append_Task }
{---------------------------------------------------------------------}
PROCEDURE Add_New_Task(T_Name : STRING50; Index : INTEGER);
{ Procedure to add a new task }
VAR i,j : INTEGER;
BEGIN
WITH Task_array DO
BEGIN
IF Index > 0
THEN { Insert new task }
BEGIN
IF Task_Num >= Index THEN INC(Task_Num);
FOR i := 1 TO N_Tasks DO
BEGIN
IF Tasks[i].N_Calls > 0 THEN
BEGIN
FOR j := 1 TO Tasks[i].N_Calls DO
IF Tasks[i].Calls[j] >= Index THEN
INC(Tasks[i].Calls[j]);
END; { IF }
IF Tasks[i].N_Responses > 0 THEN
BEGIN
FOR j := 1 TO Tasks[i].N_Responses DO
IF Tasks[i].Responses[j] >= Index THEN
INC(Tasks[i].Responses[j]);
END; { IF }
END; { FOR }
FOR i := N_Tasks DOWNTO Index DO
Tasks[i+1] := Tasks[i];
INC(N_Tasks);
END
ELSE { Append new task }
BEGIN
INC(N_Tasks);
Index := N_Tasks;
END; { IF }
Tasks[Index].N_Calls := 0;
Tasks[Index].N_Responses := 0;
Tasks[Index].Task_Name := T_Name;
Input_Task(Index);
Tasks[Index].Level := Tasks[Task_Num].Level + 1;
Append_Task(T_Name,Index);
END; { WITH }
END;{ Add_New_Task }
{---------------------------------------------------------------------}
PROCEDURE Add_Task;
{ Procedure to add a task. AT this stage it is not known if the task }
{ is a new one. }
BEGIN
IF NOT Lock_on_Task THEN List_Atoms;
ClrScr;
Center_Text('-------- A D D I N G T A S K --------',2);
WRITELN; WRITELN; WRITELN;
WITH Task_array DO
BEGIN
WRITELN('Linking a task to ',Tasks[Task_Num].Task_Name); WRITELN;
WRITE('Enter task name '); READLN(Name);
IF NOT Search(Name,Insert_Loc)
THEN
BEGIN
IF Task_array.N_Tasks = Max_Tasks
THEN
Message('Cannot add new tasks')
ELSE
Add_New_Task(Name,Insert_Loc);
END
ELSE
Append_Task(Name,Insert_Loc); { END IF }
END; { WITH }
END;{ Add_Task }
{---------------------------------------------------------------------}
PROCEDURE Delete_Task;
{ Procedure to delete a task, remove its pointers from the call/response }
{ lists and "renumber" all other pointers. }
VAR i,j,k,m : INTEGER;
Found : BOOLEAN;
BEGIN
IF NOT Lock_on_Task THEN List_Atoms;
IF Task_array.Tasks[Task_Num].Task_Name ='M A I N'
THEN
Message('You cannot delete the MAIN activity ')
ELSE
BEGIN { Proceed with deletion }
Lock_on_Task := FALSE;
ClrScr;
Center_Text('-------- D E L E T I N G T A S K --------',2);
GOTOXY(1,5);
WITH Task_array DO
BEGIN
WRITELN('Deleting task ',Tasks[Task_Num].Task_Name);
FOR i := 1 TO N_Tasks DO
BEGIN
IF Tasks[i].N_Calls > 0 THEN
FOR j := 1 TO Tasks[i].N_Calls DO
IF Tasks[i].Calls[j] >= Task_Num THEN DEC(Tasks[i].Calls[j]);
IF Tasks[i].N_Responses > 0 THEN
FOR j := 1 TO Tasks[i].N_Responses DO
IF Tasks[i].Responses[j] >= Task_Num THEN
DEC(Tasks[i].Responses[j]);
END; { FOR }
IF Tasks[Task_Num].N_Calls > 0 THEN
BEGIN
FOR i := 1 TO Tasks[Task_Num].N_Calls DO
BEGIN
m := Tasks[Task_Num].Calls[i] + 1;
Found := FALSE; j := 1;
WHILE (j <= Tasks[m].N_Responses) AND (NOT Found) DO
IF (Task_Num-1) = Tasks[m].Responses[j]
THEN Found := TRUE
ELSE INC(j);
k := j;
FOR j := k TO Tasks[m].N_Responses-1 DO
Tasks[m].Responses[j] := Tasks[m].Responses[j+1];
DEC(Tasks[m].N_Responses)
END; { FOR }
END; { IF }
{ Remove the task number from calling tasks' lists }
IF Tasks[Task_Num].N_Responses > 0
THEN
BEGIN
FOR i := 1 TO Tasks[Task_Num].N_Responses DO
BEGIN
m := Tasks[Task_Num].Responses[i] + 1;
Found := FALSE; j := 1;
WHILE (j <= Tasks[m].N_Calls) AND (NOT Found) DO
IF (Task_Num-1) = Tasks[m].Calls[j]
THEN Found := TRUE
ELSE INC(j);
k := j;
FOR j := k TO Tasks[m].N_Calls - 1 DO
Tasks[m].Calls[j] := Tasks[m].Calls[j+1];
DEC(Tasks[m].N_Calls)
END; { FOR }
END; { IF }
IF Task_Num < N_Tasks
THEN
FOR i := Task_Num TO N_Tasks-1 DO
Tasks[i] := Tasks[i+1];
DEC(N_Tasks);
Message(' ');
END; { WITH }
END; { IF statement to check for valid deletion }
END; {Delete_Tasks }
{---------------------------------------------------------------------}
PROCEDURE Change_Task;
{ Procedure to change task description and generic Function number }
VAR i : INTEGER;
BEGIN
IF NOT Lock_on_Task THEN List_Atoms;
ClrScr;
Center_Text('-------- C H A N G I N G T A S K --------',2);
WRITELN;
WITH Task_array DO
BEGIN
WRITELN('Changing task ',Tasks[Task_Num].Task_Name); WRITELN;
Input_Task(Task_Num);
END; { WITH }
END;{ Change_Task }
{---------------------------------------------------------------------}
PROCEDURE Page;
{ Monitors the page/screen limits. }
{ Variables : }
{ Line, Max_Line for line control }
{ Dev_Out : for output device. }
VAR C : CHAR;
BEGIN
INC(Line);
IF Line > Max_Line THEN
BEGIN
Line := 1;
CASE Dev_Num OF
1 : Message(' ');
2 : BEGIN
WRITELN(Lst,^L);
INC(Page_Num);
WRITE(Lst,'Page ',Page_Num);
WRITELN(Lst,' '); INC(Line)
END;
ELSE ;
END; { CASE }
END; { IF }
END; { Page }
{---------------------------------------------------------------------}
PROCEDURE List_Gen_Func(Index : INTEGER);
{ Procedure to list tasks according to their generic Functions }
VAR i,j : INTEGER;
Strr : STRING50;
BEGIN
WITH Task_array DO
BEGIN
Line := 2;
OUTWRITE('List of tasks with generic Function : ');
OUTWRITELN(Gen_Func_List[Index]);
OUTWRITELN(' ');
FOR i := 1 to N_Tasks DO
IF Tasks[i].Gen_Func = Index THEN
BEGIN
OUTWRITE(Tasks[i].Task_Name);
OUTWRITE(' : '); OUTWRITELN(Tasks[i].Func_Name);
Page
END; { IF }
END; { WITH }
END; { List_Gen_Func }
{---------------------------------------------------------------------}
PROCEDURE List_Level;
{ Procedure to produce a histogram showing the tasks and thier levels }
VAR i,j : INTEGER;
Strr : STRING50;
PROCEDURE Histogram(X : INTEGER);
VAR Skip : INTEGER;
BEGIN
Skip := 30 - Length(Task_array.Tasks[i].Task_Name);
WHILE (Skip > 0) DO
BEGIN { Fill in the blanks }
OUTWRITE(' ');
DEC(Skip);
END; { WHILE }
WHILE X > 0 DO
BEGIN
OUTWRITE('*');
DEC(X);
END; { WHILE }
OUTWRITELN(' ');
END; {Histogram }
BEGIN { List_Level }
WITH Task_array DO
BEGIN
Line := 2;
OUTWRITELN(' ');
FOR i := 1 TO N_Tasks DO
BEGIN
OUTWRITE(Tasks[i].Task_Name); OUTWRITE(' : ');
Histogram(Tasks[i].Level); Page
END; { FOR }
END; { WITH }
END; { List_Level }
{---------------------------------------------------------------------}
PROCEDURE List_Task(Index : INTEGER);
{ Procedure to list the connection with a particular task }
VAR i,j : INTEGER;
BEGIN
WITH Task_array DO
BEGIN
Line := 2;
OUTWRITE('List all links with task ');
OUTWRITELN(Tasks[Index].Task_Name);
OUTWRITELN(' ');
IF Tasks[Index].N_Calls > 0
THEN
BEGIN
OUTWRITELN(' '); Page;
OUTWRITELN('The following are the responding tasks'); Page;
FOR i := 1 TO Tasks[Index].N_Calls DO
BEGIN
j := Tasks[Index].Calls[i];
OUTWRITELN(Tasks[j].Task_Name); Page;
END; { FOR }
END; { IF }
OUTWRITELN(' '); Page;
IF Tasks[Index].N_Responses > 0
THEN
BEGIN
OUTWRITELN(' '); Page;
OUTWRITELN('The following are the calling tasks'); Page;
FOR i := 1 TO Tasks[Index].N_Responses DO
BEGIN
j := Tasks[Index].Responses[i];
OUTWRITELN(Tasks[j].Task_Name); Page;
END; { FOR }
END; { IF }
END; { WITH }
END; { List_Tasks }
{---------------------------------------------------------------------}
PROCEDURE List_All;
{ Procedure to list all tasks }
VAR i,j,k : INTEGER;
Strr : STRING50;
BEGIN
WITH Task_array DO
BEGIN
Line := 2;
OUTWRITE('List of all tasks for actigram ');
OUTWRITELN(Title);
OUTWRITELN(' ');
FOR i := 1 TO N_Tasks DO
BEGIN
OUTWRITE('# ');
Str(i,Strr); OUTWRITE(Strr);
OUTWRITE(' '); OUTWRITE(Tasks[i].Task_Name);
OUTWRITE(' : '); OUTWRITELN(Tasks[i].Func_Name);
Page;
END; { FOR }
OUTWRITELN(' '); Page;
FOR i := 1 TO N_Tasks DO
BEGIN
IF Tasks[i].N_Calls > 0
THEN
BEGIN
OUTWRITELN(' '); Page;
OUTWRITE('The following are the tasks responding to ');
OUTWRITELN(Tasks[i].Task_Name); Page;
FOR k := 1 TO Tasks[i].N_Calls DO
BEGIN
j := Tasks[i].Calls[k];
OUTWRITELN(Tasks[j].Task_Name); Page;
END; { FOR }
END; { IF }
OUTWRITELN(' '); Page;
IF Tasks[i].N_Responses > 0
THEN
BEGIN
OUTWRITELN(' '); Page;
OUTWRITE('The following are the tasks calling ');
OUTWRITELN(Tasks[i].Task_Name); Page;
FOR k := 1 TO Tasks[i].N_Responses DO
BEGIN
j := Tasks[i].Responses[k];
OUTWRITELN(Tasks[j].Task_Name); Page;
END; { FOR }
END; { IF }
END; { FOR }
END; { WITH }
END; { List_all }
{-------------------------------------------------------------------}
PROCEDURE List_Menu;
{ Procedure to list the output menu }
VAR IsFile : BOOLEAN;
Select, i : INTEGER;
OutFile : STRING50;
BEGIN
ClrScr;
Center_Text('------------ LIST / VIEW MENU ------------',1);
Center_Text('***** OUTPUT OPTIONS *****',2);
WRITELN; WRITELN;
WRITELN('0) Exit'); WRITELN;
WRITELN('1) Send to screen'); WRITELN;
WRITELN('2) Send to printer'); WRITELN;
WRITELN('3) Send to file'); WRITELN;
WRITELN;
REPEAT
WRITELN;
WRITE('Enter choice by number ');
READLN(Select);
UNTIL Select IN [0..3];
IsFile := FALSE;
CASE Select OF
1 : BEGIN { Set screen parameters }
Dev_Num := 1;
Max_Line := 20;
END;
2 : BEGIN { Set printer paramters }
Dev_Num := 2;
Max_Line := 60;
WRITELN(Lst,'Page 1');
Page_Num := 1;
END;
3 : BEGIN
Dev_Num := 3;
Max_Line := 32000;
WRITELN;
WRITE('Enter filename ');
READLN(OutFile);
Assign(Dev_Out,OutFile);
Rewrite(Dev_Out);
END;
ELSE ;
END; { CASE }
IF Select > 0 THEN
BEGIN
ClrScr;
Center_Text('------------ LIST / VIEW MENU ------------',1);
WRITELN; WRITELN;
WRITELN('0) Exit'); WRITELN;
WRITELN('1) List All'); WRITELN;
WRITELN('2) List a particular task'); WRITELN;
WRITELN('3) List by level '); WRITELN;
WRITELN('4) List by generic Function'); WRITELN;
WRITELN;
REPEAT
WRITELN;
WRITE('Enter choice by number ');
READLN(Select);
UNTIL Select IN [0..4];
IF Dev_Num = 1 THEN
BEGIN
ClrScr;
GOTOXY(1,1);
END;
CASE Select OF
1 : List_All;
2 : BEGIN
IF Lock_on_Task THEN Copy_Task := Task_Num;
List_Atoms;
List_Task(Task_Num);
IF Lock_on_Task THEN Task_Num := Copy_Task;
END;
3 : List_Level;
4 : BEGIN
WRITELN('Generic Function list');
FOR i := 1 TO Max_Gen_Func_List DO
WRITELN('# ',i,' ::= ',Gen_Func_List[i]);
WRITELN;
WRITE('Enter generic Function number ');
READLN(Level);
List_Gen_Func(Level);
END;
ELSE ;
END; { CASE }
CASE Dev_Num OF
1 : Message(' ');
2 : WRITELN(Lst,^L);
3 : Close(Dev_Out);
END; { CASE }
END;
END; { List_Menu }
{---------------------------------------------------------------------}
{ M M AAA IIIII N N }
{ MM MM A A I NN N }
{ M M M AAAAA I N N N }
{ M M A A I N N N }
{ M M A A IIIII N NN }
{---------------------------------------------------------------------}
BEGIN { M A I N }
ClrScr;
Lock_on_Task := FALSE;
Center_Text('<<<<<<<<<< A C T I G R A M >>>>>>>>>>',1); WRITELN; WRITELN;
WRITELN('1) Start a new actigram'); WRITELN;
WRITELN('2) Load an actigram from file'); WRITELN;
REPEAT
WRITELN;
WRITE('Enter your choice by number ');
READLN(Choice);
UNTIL Choice IN [1..2];
WRITELN;
IF Choice = 1 THEN New_File
ELSE Load(Data_File,Task_Array);
REPEAT
Load_Gen_Func;
ClrScr;
Center_Text('----------<<< M A I N M E N U >>>----------',1);
WRITELN;
IF Lock_on_Task THEN
WRITELN('Locked on task : ',Task_array.Tasks[Task_Num].Task_Name);
WRITELN;
WRITELN('0) Quit'); WRITELN;
WRITELN('1) Add Task'); WRITELN;
WRITELN('2) Change Task'); WRITELN;
WRITELN('3) Delete Task'); WRITELN;
WRITELN('4) Access List/View Menu'); WRITELN;
WRITELN('5) Lock on a task'); WRITELN;
WRITELN('6) Unlock task'); WRITELN;
WRITELN;
REPEAT
WRITELN;
WRITE('Enter choice by number ');
READLN(Choice);
UNTIL Choice IN [0..6];
WRITELN;
CASE Choice OF
0 : Save(Data_File,Task_Array);
1 : Add_Task;
2 : Change_Task;
3 : Delete_Task;
4 : List_Menu;
5 : BEGIN
List_Atoms;
Lock_on_Task := TRUE;
END;
6 : Lock_on_Task := FALSE;
END; { CASE }
UNTIL Choice = 0;
END. { ACTIGRAM }